#!/usr/bin/python
# author Yu
# 2023年06月20日
import socket
import struct


class Client:
    def __init__(self,ip,port):
        self.addr = (ip, port)  # 服务器地址
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.client_socket.connect(self.addr)#连接服务器
    def connect(self):#连接服务器
        self.recv_file()#接收文件
        self.client_socket.close()#关闭客户端套接字
    def recv_file(self):#接收文件
        length=self.recv_train()#接收火车头,获取文件名长度
        file_name=self.client_socket.recv(length)#接收火车车厢,获取文件名
        self.write_file(file_name.decode('utf-8'))#写入文件

    def write_file(self,file_name):#写入文件
        total=0
        length=self.recv_train()#接收火车头,获取文件内容长度
        with open(file_name, 'wb') as file:  # 以二进制写入文件
            while total<length:#循环接收文件内容
                data=self.client_socket.recv(length-total)#接收文件内容
                total+=len(data)#累加接收到的文件内容长度
                file.write(data)#写入文件

    def recv_train(self):#接收火车头
        train_head=self.client_socket.recv(4)#接收火车头，4个字节
        length=struct.unpack('I',train_head)#把字节流转为python的整型数
        return length[0]#返回火车车厢的长度，因为struct.unpack返回的是元组，所以要用length[0]取出长度
client=Client('8.130.103.70',9999)
client.connect()